package org.kvj.lima1.sync.controller.net;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.Socket;
import java.net.UnknownHostException;
import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.UnrecoverableKeyException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import org.apache.http.HttpEntity;
import org.apache.http.HttpHost;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.conn.params.ConnRouteParams;
import org.apache.http.conn.scheme.PlainSocketFactory;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.scheme.SchemeRegistry;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.entity.StringEntity;
import org.apache.http.entity.mime.HttpMultipartMode;
import org.apache.http.entity.mime.MultipartEntity;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.entity.mime.content.StringBody;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.params.HttpParams;
import org.json.JSONObject;
import android.content.Context;
import android.net.Proxy;
import android.util.Log;
public class HttpClientTransport implements NetTransport {
private static final String TAG = "Http";
private String url = "";
private String proxyHost = null;
private int proxyPort = 0;
@Override
public void setURL(Context context, String url) {
this.url = url;
proxyHost = Proxy.getHost(context);
proxyPort = Proxy.getPort(context);
}
public class MySSLSocketFactory extends SSLSocketFactory {
SSLContext sslContext = SSLContext.getInstance("TLS");
public MySSLSocketFactory(KeyStore truststore) throws NoSuchAlgorithmException, KeyManagementException,
KeyStoreException, UnrecoverableKeyException {
super(truststore);
TrustManager tm = new X509TrustManager() {
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
@Override
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
@Override
public X509Certificate[] getAcceptedIssuers() {
return null;
}
};
sslContext.init(null, new TrustManager[] { tm }, null);
}
@Override
public Socket createSocket(Socket socket, String host, int port, boolean autoClose) throws IOException,
UnknownHostException {
return sslContext.getSocketFactory().createSocket(socket, host, port, autoClose);
}
@Override
public Socket createSocket() throws IOException {
return sslContext.getSocketFactory().createSocket();
}
}
@SuppressWarnings("unchecked")
@Override
public JSONObject request(String uri, RequestType type, Object data, String contentType)
throws NetTransportException {
int code = 500;
try {
Log.i(TAG, "Request: " + uri + ", " + type);
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpParams params = httpClient.getParams();
SchemeRegistry schemeRegistry = new SchemeRegistry();
schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
trustStore.load(null, null);
SSLSocketFactory sf = new MySSLSocketFactory(trustStore);
sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
schemeRegistry.register(new Scheme("https", sf, 443));
ThreadSafeClientConnManager cm = new ThreadSafeClientConnManager(params, schemeRegistry);
httpClient.setParams(params);
if (proxyHost != null && proxyPort > 0) {
params.setParameter(ConnRouteParams.DEFAULT_PROXY, new HttpHost(proxyHost, proxyPort));
}
DefaultHttpClient nHttpClient = new DefaultHttpClient(cm, params);
HttpUriRequest request = new HttpGet(url + uri);
if (null != data && type != RequestType.Get) {
HttpPost post = new HttpPost(url + uri);
if (data instanceof Map) {
Map<String, Object> map = (Map<String, Object>) data;
boolean multipart = false;
for (Object value : ((Map) data).values()) { // Check
if (value instanceof File) { // At least one is file
multipart = true;
break;
}
}
if (multipart) { //
MultipartEntity entity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
for (String key : map.keySet()) {
Object value = map.get(key);
if (value instanceof File) { // File entity
entity.addPart(key, new FileBody((File) value, "application/octet-stream"));
} else {
entity.addPart(key, new StringBody(value.toString()));
}
}
post.setEntity(entity);
} else { //
List<NameValuePair> pairs = new ArrayList<NameValuePair>();
for (String key : map.keySet()) {
pairs.add(new BasicNameValuePair(key, map.get(key).toString()));
}
post.setEntity(new UrlEncodedFormEntity(pairs));
}
}
if (data instanceof JSONObject) {
JSONObject json = (JSONObject) data;
StringEntity entity = new StringEntity(json.toString(), "utf-8");
if (null != contentType) {
entity.setContentType(contentType);
}
post.setEntity(entity);
}
request = post;
}
HttpResponse response = nHttpClient.execute(request);
code = response.getStatusLine().getStatusCode();
HttpEntity entity = response.getEntity();
if (null != entity) {
JSONObject result = new JSONObject(readString(entity));
if (200 == code) {
return result;
}
Log.i(TAG, "JSON: " + result);
throw new NetTransportException(code, result.optString("message",
result.optString("error_description", "No error message")), null);
}
throw new NetTransportException(code, "No response", null);
} catch (NetTransportException e) {
throw e;
} catch (Exception e) {
e.printStackTrace();
throw new NetTransportException(code, e.getMessage(), e);
}
}
private String readString(HttpEntity entity) throws UnsupportedEncodingException, IllegalStateException,
IOException {
StringBuilder sb = new StringBuilder();
InputStreamReader reader = new InputStreamReader(entity.getContent(), "utf-8");
int ch = -1;
while ((ch = reader.read()) != -1) {
sb.append((char) ch);
}
reader.close();
return sb.toString();
}
@Override
public InputStream rawRequest(String uri, RequestType type, Object data, String contentType)
throws NetTransportException {
int code = 500;
try {
Log.i(TAG, "Request: " + uri + ", " + type);
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpParams params = httpClient.getParams();
SchemeRegistry schemeRegistry = new SchemeRegistry();
schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
trustStore.load(null, null);
SSLSocketFactory sf = new MySSLSocketFactory(trustStore);
sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
schemeRegistry.register(new Scheme("https", sf, 443));
ThreadSafeClientConnManager cm = new ThreadSafeClientConnManager(params, schemeRegistry);
httpClient.setParams(params);
if (proxyHost != null && proxyPort > 0) {
params.setParameter(ConnRouteParams.DEFAULT_PROXY, new HttpHost(proxyHost, proxyPort));
}
DefaultHttpClient nHttpClient = new DefaultHttpClient(cm, params);
HttpUriRequest request = new HttpGet(url + uri);
if (null != data && type != RequestType.Get) {
HttpPost post = new HttpPost(url + uri);
if (data instanceof Map) {
Map<String, Object> map = (Map<String, Object>) data;
List<NameValuePair> pairs = new ArrayList<NameValuePair>();
for (String key : map.keySet()) {
pairs.add(new BasicNameValuePair(key, map.get(key).toString()));
}
post.setEntity(new UrlEncodedFormEntity(pairs));
}
if (data instanceof JSONObject) {
JSONObject json = (JSONObject) data;
StringEntity entity = new StringEntity(json.toString(), "utf-8");
if (null != contentType) {
entity.setContentType(contentType);
}
post.setEntity(entity);
}
request = post;
}
HttpResponse response = nHttpClient.execute(request);
code = response.getStatusLine().getStatusCode();
HttpEntity entity = response.getEntity();
if (null != entity) {
if (200 == code) {
return entity.getContent();
}
throw new NetTransportException(code, "HTTP error", null);
}
throw new NetTransportException(code, "No response", null);
} catch (NetTransportException e) {
throw e;
} catch (Exception e) {
e.printStackTrace();
throw new NetTransportException(code, e.getMessage(), e);
}
}
}